Research
Security News
Quasar RAT Disguised as an npm Package for Detecting Vulnerabilities in Ethereum Smart Contracts
Socket researchers uncover a malicious npm package posing as a tool for detecting vulnerabilities in Etherium smart contracts.
date-and-time
Advanced tools
The date-and-time npm package is a lightweight library for date and time manipulation in JavaScript. It provides a variety of functions for parsing, formatting, adding, subtracting, and comparing dates and times.
Formatting Dates
This feature allows you to format dates into various string representations. The format method takes a date object and a format string as arguments.
const date = new Date(2023, 9, 10);
const dateAndTime = require('date-and-time');
const formattedDate = dateAndTime.format(date, 'YYYY/MM/DD HH:mm:ss');
console.log(formattedDate); // Output: 2023/10/10 00:00:00
Parsing Dates
This feature allows you to parse date strings into JavaScript Date objects. The parse method takes a date string and a format string as arguments.
const dateAndTime = require('date-and-time');
const dateString = '2023/10/10 00:00:00';
const parsedDate = dateAndTime.parse(dateString, 'YYYY/MM/DD HH:mm:ss');
console.log(parsedDate); // Output: Tue Oct 10 2023 00:00:00 GMT+0000 (Coordinated Universal Time)
Adding and Subtracting Time
This feature allows you to add or subtract time units (days, months, years, etc.) from a date. The addDays and addMonths methods are used in this example.
const dateAndTime = require('date-and-time');
let date = new Date(2023, 9, 10);
date = dateAndTime.addDays(date, 5);
console.log(date); // Output: Sun Oct 15 2023 00:00:00 GMT+0000 (Coordinated Universal Time)
date = dateAndTime.addMonths(date, -1);
console.log(date); // Output: Fri Sep 15 2023 00:00:00 GMT+0000 (Coordinated Universal Time)
Comparing Dates
This feature allows you to compare dates. The isSameDay method checks if two dates fall on the same day.
const dateAndTime = require('date-and-time');
const date1 = new Date(2023, 9, 10);
const date2 = new Date(2023, 9, 15);
const isSameDay = dateAndTime.isSameDay(date1, date2);
console.log(isSameDay); // Output: false
Moment.js is a widely-used library for date and time manipulation. It offers extensive functionality for parsing, validating, manipulating, and formatting dates. Compared to date-and-time, Moment.js is more feature-rich but also larger in size.
date-fns is a modern JavaScript date utility library that provides a comprehensive set of functions for date manipulation. It is modular, allowing you to import only the functions you need, making it more lightweight compared to Moment.js. date-fns is similar to date-and-time in terms of functionality but offers a more functional programming approach.
Luxon is a modern library for working with dates and times in JavaScript. It is built by one of the Moment.js developers and offers a more modern API with better support for internationalization. Luxon is more feature-rich than date-and-time and is designed to be a more modern alternative to Moment.js.
This library is a minimalist collection of functions for manipulating JS date and time. It's tiny, simple, easy to learn.
JS modules nowadays are getting more huge and complex, and there are also many dependencies. Trying to keep each module simple and small is meaningful.
npm install date-and-time --save
<script src="/path/to/date-and-time.min.js"></script>
0.11.0
compile()
function that precompiling a date string for the parser. In case of processing many date string with one format, by using this function, you could get results faster than before.// We have passed a string format at the 2nd parameter every time when calling the parse() function.
date.parse('Mar. 22 2019 2:54:21 p.m.', 'MMM. D YYYY h:m:s A');
date.parse('Jul. 27 2019 4:15:24 a.m.', 'MMM. D YYYY h:m:s A');
date.parse('Dec. 25 2019 3:51:11 a.m.', 'MMM. D YYYY h:m:s A');
// You can precompile the string format.
const pattern = date.compile('MMM. D YYYY h:m:s A');
// The parse() will be able to finish faster than passing the format string every time.
date.parse('Mar. 22 2019 2:54:21 p.m.', pattern);
date.parse('Jul. 27 2019 4:15:24 a.m.', pattern);
date.parse('Dec. 25 2019 3:51:11 a.m.', pattern);
const pattern = date.compile('MMM. D YYYY h:m:s A');
// The isValid() will also too.
date.isValid('Mar. 22 2019 2:54:21 p.m.', pattern);
0.10.0
YYYY
token has come to require 4 digits in the parse()
, the preparse()
and the isValid()
(Breaking Change).date.parse('31-12-0123', 'DD-MM-YYYY'); // Good
date.parse('31-12-123', 'DD-MM-YYYY'); // Not good
YY
token has come to require 2 digits in the above functions (Breaking Change).date.parse('31-12-03', 'DD-MM-YY'); // Good, but It's interpreted the year is 2003.
date.parse('31-12-3', 'DD-MM-YY'); // Not good
Y
token to support year, 4 or less digits in the above functions. This new token, Y
is equivalent to the previous YYYY
token.date.parse('31-12-123', 'DD-MM-Y'); // Good
date.parse('31-12-3', 'DD-MM-Y'); // Good
0.9.0 (Locale Update)
format()
has come to accept a user original token.0.8.0 (Parser Update)
parse()
has come to return Invalid Date
instead of NaN
when parsing is failure (Breaking Change).preparse()
. It returns a Date Structure.isValid()
has come to take a Date Structure in addition to a date string.isLeapYear()
has come to take a year (number type) instead of a Date object (Breaking Change).const date = require('date-and-time');
import date from 'date-and-time';
window.date; // global object
const now = new Date();
date.format(now, 'YYYY/MM/DD HH:mm:ss'); // => '2015/01/02 23:14:05'
date.format(now, 'ddd., MMM. DD YYYY'); // => 'Fri., Jan. 02 2015'
date.format(now, 'hh:mm A [GMT]Z'); // => '11:14 p.m. GMT-0800'
date.format(now, 'hh:mm A [GMT]Z', true); // => '07:14 a.m. GMT+0000'
Available tokens and their meanings are as follows:
token | meaning | example |
---|---|---|
YYYY | year | 0999, 2015 |
YY | year | 05, 99 |
Y | year | 2, 44, 888, 2015 |
MMMM | month | January, December |
MMM | month | Jan, Dec |
MM | month | 01, 12 |
M | month | 1, 12 |
DDD (*) | day | 1st, 2nd, 3rd |
DD | day | 02, 31 |
D | day | 2, 31 |
dddd | day of week | Friday, Sunday |
ddd | day of week | Fri, Sun |
dd | day of week | Fr, Su |
HH | 24-hour | 23, 08 |
H | 24-hour | 23, 8 |
A | meridiem | a.m., p.m. |
a (*) | meridiem | A.M., P.M. |
AA (*) | meridiem | AM, PM |
aa (*) | meridiem | am, pm |
hh | 12-hour | 11, 08 |
h | 12-hour | 11, 8 |
mm | minute | 14, 07 |
m | minute | 14, 7 |
ss | second | 05, 10 |
s | second | 5, 10 |
SSS | millisecond | 753, 022 |
SS | millisecond | 75, 02 |
S | millisecond | 7, 0 |
Z | timezone | +0100, -0800 |
(*) Not available by default. See PLUGINS.md for details.
Strings in parenthese [...]
in the formatString
will be ignored as comments:
date.format(new Date(), 'DD-[MM]-YYYY'); // => '02-MM-2015'
date.format(new Date(), '[DD-[MM]-YYYY]'); // => 'DD-[MM]-YYYY'
This function usually outputs a local date-time string. Set to true a utc
option (the 3rd parameter) if you would like to get a UTC date/time string.
date.format(new Date(), 'hh:mm A [GMT]Z'); // => '11:14 p.m. GMT-0800'
date.format(new Date(), 'hh:mm A [GMT]Z', true); // => '07:14 a.m. GMT+0000'
You could also define your own tokens. See PLUGINS.md for details.
const pattern = date.compile('MMM. D YYYY h:m:s A');
date.parse('Mar. 22 2019 2:54:21 p.m.', pattern);
date.parse('Jul. 27 2019 4:15:24 a.m.', pattern);
date.parse('Dec. 25 2019 3:51:11 a.m.', pattern);
If you are going to call the parse()
or the isValid()
many times with one string format, recommended to precompile and reuse it for performance.
date.parse('2015/01/02 23:14:05', 'YYYY/MM/DD HH:mm:ss'); // => Jan. 2 2015 23:14:05 GMT-0800
date.parse('02-01-2015', 'DD-MM-YYYY'); // => Jan. 2 2015 00:00:00 GMT-0800
date.parse('11:14:05 p.m.', 'hh:mm:ss A'); // => Jan. 1 1970 23:14:05 GMT-0800
date.parse('11:14:05 p.m.', 'hh:mm:ss A', true); // => Jan. 1 1970 15:14:05 GMT-0800
date.parse('Jam. 1 2017', 'MMM. D YYYY'); // => Invalid Date
date.parse('Feb. 29 2016', 'MMM. D YYYY'); // => Feb. 29 2016 00:00:00 GMT-0800
date.parse('Feb. 29 2017', 'MMM. D YYYY'); // => Invalid Date
Available tokens and their meanings are as follows:
token | meaning | example |
---|---|---|
YYYY | year | 0999, 2015 |
YY | year | 05, 99 |
Y | year | 2, 44, 88, 2015 |
MMMM | month | January, December |
MMM | month | Jan, Dec |
MM | month | 01, 12 |
M | month | 1, 12 |
DD | day | 02, 31 |
D | day | 2, 31 |
HH | 24-hour | 23, 08 |
H | 24-hour | 23, 8 |
hh | 12-hour | 11, 08 |
h | 12-hour | 11, 8 |
A | meridiem | a.m., p.m. |
A (*) | meridiem | A.M., P.M. |
A (*) | meridiem | AM, PM |
A (*) | meridiem | am, pm |
mm | minute | 14, 07 |
m | minute | 14, 7 |
ss | second | 05, 10 |
s | second | 5, 10 |
SSS | millisecond | 753, 022 |
SS | millisecond | 75, 02 |
S | millisecond | 7, 0 |
(*) Not available by default. See PLUGINS.md for details.
If the function fails to parse, it will return Invalid Date
. Notice that the Invalid Date
is a Date object, not NaN
or null
. You could tell whether the Date object is invalid as follows:
const today = date.parse('Jam. 1 2017', 'MMM. D YYYY');
if (isNaN(today)) {
// Failure
}
This function usually assumes the dateString
is local date-time. Set to true a utc
option (the 3rd parameter) if it is UTC.
date.parse('11:14:05 p.m.', 'hh:mm:ss A'); // => Jan. 1 1970 23:14:05 GMT-0800
date.parse('11:14:05 p.m.', 'hh:mm:ss A', true); // => Jan. 1 1970 15:14:05 GMT-0800
Default date is January 1, 1970
, time is 00:00:00.000
. Values not passed will be complemented with them:
date.parse('11:14:05 p.m.', 'hh:mm:ss A'); // => Jan. 1 1970 23:14:05 GMT-0800
date.parse('Feb. 2000', 'MMM. YYYY'); // => Feb. 1 2000 00:00:00 GMT-0800
Parsable maximum date is December 31, 9999
, minimum date is January 1, 0001
.
date.parse('Dec. 31 9999', 'MMM. D YYYY'); // => Dec. 31 9999 00:00:00 GMT-0800
date.parse('Dec. 31 10000', 'MMM. D YYYY'); // => Invalid Date
date.parse('Jan. 1 0001', 'MMM. D YYYY'); // => Jan. 1 0001 00:00:00 GMT-0800
date.parse('Jan. 1 0000', 'MMM. D YYYY'); // => Invalid Date
The YY
token maps the year 69 or less to the 2000s, the year 70 or more to the 1900s. Using it is not recommended.
date.parse('Dec. 31 00', 'MMM. D YY'); // => Dec. 31 2000 00:00:00 GMT-0800
date.parse('Dec. 31 69', 'MMM. D YY'); // => Dec. 31 2069 00:00:00 GMT-0800
date.parse('Dec. 31 70', 'MMM. D YY'); // => Dec. 31 1970 00:00:00 GMT-0800
date.parse('Dec. 31 99', 'MMM. D YY'); // => Dec. 31 1999 00:00:00 GMT-0800
If use the hh
or h
(12-hour) token, use together the A
(meridiem) token to get the right value.
date.parse('11:14:05', 'hh:mm:ss'); // => Jan. 1 1970 11:14:05 GMT-0800
date.parse('11:14:05 p.m.', 'hh:mm:ss A'); // => Jan. 1 1970 23:14:05 GMT-0800
Strings in parenthese [...]
in the formatString will be ignored as comments:
date.parse('12 hours 34 minutes', 'HH hours mm minutes'); // => Invalid Date
date.parse('12 hours 34 minutes', 'HH [hours] mm [minutes]'); // => Jan. 1 1970 12:34:00 GMT-0800
A white space works as a wildcard token. This token is not interpret into anything. This means it can be ignored a specific variable string. For example, when you want to ignore a time part from a date string, you can write as follows:
// This will be an error.
date.parse('2015/01/02 11:14:05', 'YYYY/MM/DD'); // => Invalid Date
// Append the same length white spaces behind the formatString.
date.parse('2015/01/02 11:14:05', 'YYYY/MM/DD '); // => Jan. 2 2015 00:00:00 GMT-0800
This function takes exactly the same parameters with the parse()
, but returns a date structure as follows unlike it:
date.preparse('2015/01/02 23:14:05', 'YYYY/MM/DD HH:mm:ss');
{
Y: 2015, // Year
M: 1, // Month
D: 2, // Day
H: 23, // 24-hour
A: 0, // Meridiem
h: 0, // 12-hour
m: 14, // Minute
s: 5, // Second
S: 0, // Millisecond
_index: 19, // Pointer offset
_length: 19, // Length of the date string
_match: 6 // Token matching count
}
This object shows a parsing result. You would be able to tell from it how the date string was parsed(, or why the parsing was failed).
This function takes either exactly the same parameters with the parse()
or a date structure which the preparse()
returns, evaluates the validity of them.
date.isValid('2015/01/02 23:14:05', 'YYYY/MM/DD HH:mm:ss'); // => true
date.isValid('29-02-2015', 'DD-MM-YYYY'); // => false
const result = date.preparse('2015/01/02 23:14:05', 'YYYY/MM/DD HH:mm:ss');
date.isValid(result); // => true
const now = new Date();
const next_year = date.addYears(now, 1);
const now = new Date();
const next_month = date.addMonths(now, 1);
const now = new Date();
const yesterday = date.addDays(now, -1);
const now = new Date();
const an_hour_ago = date.addHours(now, -1);
const now = new Date();
const two_minutes_later = date.addMinutes(now, 2);
const now = new Date();
const three_seconds_ago = date.addSeconds(now, -3);
const now = new Date();
const a_millisecond_later = date.addMilliseconds(now, 1);
const today = new Date(2015, 0, 2);
const yesterday = new Date(2015, 0, 1);
date.subtract(today, yesterday).toDays(); // => 1 = today - yesterday
date.subtract(today, yesterday).toHours(); // => 24
date.subtract(today, yesterday).toMinutes(); // => 1440
date.subtract(today, yesterday).toSeconds(); // => 86400
date.subtract(today, yesterday).toMilliseconds(); // => 86400000
date.isLeapYear(2015); // => false
date.isLeapYear(2012); // => true
const date1 = new Date(2017, 0, 2, 0); // Jan. 2 2017 00:00:00
const date2 = new Date(2017, 0, 2, 23, 59); // Jan. 2 2017 23:59:00
const date3 = new Date(2017, 0, 1, 23, 59); // Jan. 1 2017 23:59:00
date.isSameDay(date1, date2); // => true
date.isSameDay(date1, date3); // => false
Returns current language code if called without any parameters.
date.locale(); // "en"
To switch to any other language, call it with a language code.
date.locale('es'); // Switch to Spanish
To define a new locale, call it with new language code and a locale definition. See LOCALE.md for details.
Extends a current locale (formatter and parser). See PLUGINS.md for details.
Plugin is a named locale definition defined with the extend()
. See PLUGINS.md for details.
Chrome, Firefox, Safari, Edge, and Internet Explorer 6+.
MIT
FAQs
A Minimalist DateTime utility for Node.js and the browser
The npm package date-and-time receives a total of 271,461 weekly downloads. As such, date-and-time popularity was classified as popular.
We found that date-and-time demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket researchers uncover a malicious npm package posing as a tool for detecting vulnerabilities in Etherium smart contracts.
Security News
Research
A supply chain attack on Rspack's npm packages injected cryptomining malware, potentially impacting thousands of developers.
Research
Security News
Socket researchers discovered a malware campaign on npm delivering the Skuld infostealer via typosquatted packages, exposing sensitive data.